package com.linewell.license.demo.designPattern.createPattern.SingletonPattern;

/**
 * @Title: springBootDemo
 * @description: 双检锁/双重校验锁  单例模式
 * @author: hyuhuang@linewell.com
 * @since:2019/11/22
 */
public class Pen {
    /**
     * 保证了不同线程对这个变量进行操作时的可见性，即一个线程修改了某个变量的值，这新值对其他线程来说是立即可见的。（实现可见性）
     * 禁止进行指令重排序。（实现有序性）
     * volatile 只能保证对单次读/写的原子性。i++ 这种操作不能保证原子性。
     */
    private volatile static Pen singleton;
    private Pen (){}
    public static Pen getSingleton() {
        if (singleton == null) {
            //此处加锁，提升getSingleton的效率。
            synchronized (Pen.class) {
                if (singleton == null) {
                    singleton = new Pen();
                }
            }
        }
        return singleton;
    }
}
